<?php
use \Firebase\JWT\JWT;
// 应用公共文件
/**
 * 打印函数
 */
function p($a,$flag=1){
  echo '<pre>';
  print_r($a);
  if($flag==1){
    die;
  }
  
}

// 将数据按照所属关系封装 见图2
function arr2tree($tree, $rootId = 0,$name='name',$id="insertid")
{
    $return=array();
    foreach ($tree as $leaf) {
        if ($leaf['pid'] == $rootId) {
            foreach ($tree as $subleaf) {
                if ($subleaf['pid'] == $leaf[$id]) {
                  $leaf['children'] = arr2tree($tree, $leaf[$id],$name,$id);
                    break;
                }
            }
            $return[] = $leaf;
        }
    }
    return $return;
}
//递归数组转出二维数组
function imp($tree, $children='children') {
	
	$imparr = array();
	
	foreach($tree as $w) {
		
		if(isset($w[$children])) {
			
			$t = $w[$children];
			
			unset($w[$children]);
			
			$imparr[] = $w;
			
			if(is_array($t)) $imparr = array_merge($imparr, imp($t, $children));
			
		} else {
			
			$imparr[] = $w;
			
		}
		
	}
	
	return $imparr;
	
}




//生成验签
function signToken($uid){
  $key='!@#$%*&';         //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt
  $token=array(
      "iss"=>$key,        //签发者 可以为空
      "aud"=>'',          //面象的用户，可以为空
      "iat"=>time(),      //签发时间
      "nbf"=>time()+3,    //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
      "exp"=> time()+3600, //token 过期时间
      "data"=>[           //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
          'uid'=>$uid,
      ]
  );
  //  print_r($token);
  $jwt = JWT::encode($token, $key, "HS256");  //根据参数生成了 token
  return $jwt;
}

//验证token
function checkToken($token){
  $key='!@#$%*&'; 
  $status=array("code"=>2);
  try {
      JWT::$leeway = 60;//当前时间减去60，把时间留点余地
      $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式，这里要和签发的时候对应
     
      $arr = (array)$decoded;
      $res['code']=1;
      $res['data']=$arr['data'];
      return $res;

  } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
      $status['msg']="签名不正确";
      return $status;
  }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
      $status['msg']="token失效";
      return $status;
  }catch(\Firebase\JWT\ExpiredException $e) { // token过期
      $status['msg']="token失效";
      return $status;
  }catch(Exception $e) { //其他错误
      $status['msg']="未知错误";
      return $status;
  }
}
/**
 * 冒泡法排序
 */
function bubble_sort($arr,$key)
{
     $len = count($arr);
     for ($i = 0; $i < $len -1; $i++) {//循环对比的轮数
         for ($j = 0; $j < $len - $i - 1; $j++) {//当前轮相邻元素循环对比
         	if ($arr[$j][$key] <$arr[$j + 1][$key]) {//如果前边的大于后边的
	                 $tmp = $arr[$j];//交换数据
	                 $arr[$j] = $arr[$j + 1];
	                 $arr[$j + 1] = $tmp;
	             }
	         }
     }
	 return $arr;				 
}

function SendPost($url, $data = array()){
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
	if(!$data){
		return 'data is null';
	}
	if(is_array($data))
	{
		$data = json_encode($data);
	}
	curl_setopt($curl, CURLOPT_POST, 1);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	curl_setopt($curl, CURLOPT_HEADER, 0);
	curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Content-Length:' . strlen($data), 'Cache-Control: no-cache', 'Pragma: no-cache'));
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	$res = curl_exec($curl);
	$errorno = curl_errno($curl);
	if($errorno){
		return $errorno;
	}
	curl_close($curl);
	return $res;
	
}
/**
 * 生成微信的access_token
 */
function GetAccessToken($uniacid){
	$url=config('app.WeiqingUrl')['GetAccessTokenUrl'].$uniacid;
	
	$res=file_get_contents($url);
	$result=json_decode($res,true);
	
	if($result['code']==1){
		return $result['data']['access_token'];
	}
	return '';
}
/**
 * 生成小程序二维码
 */
function construct_XCX_Code($data=array(),$uniacid){
	
	$save_url = './storage/'.$uniacid.'/'.date('YmdHis').rand(0,9).rand(0,9).'.jpg';
	
	$return = config('app.LocalIp').'/'.$save_url;
	$token = GetAccessToken($uniacid);
	
	if(empty($data)){
		$data = array(
				'scene' => '123',
				'width' => 430				
		);
	}
	$url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$token;
	
	$result = SendPost($url,$data);
	
	$isok = file_put_contents($save_url, $result);
	if($isok){
		return $return;
	}else{
		return false;
	} 
	
}

